package com.mrogrape.notepad.data;

import java.awt.Font;
import java.awt.Frame;

import javax.swing.TransferHandler;
import javax.swing.UIManager;
import javax.swing.text.StyleContext;

import com.jidesoft.swing.FolderChooser;
import com.mrogrape.notepad.activity.MainFrame;
import com.mrogrape.notepad.activity.action.MainFrameAction;
import com.mrogrape.notepad.activity.action.MainFrameTransferHandler;
import com.mrogrape.notepad.ui.FileProperyDialog;
import com.mrogrape.notepad.ui.FontChooser;
import com.mrogrape.notepad.ui.GotoLineDialog;
import com.mrogrape.notepad.ui.RecentFileMenu;
import com.mrogrape.notepad.ui.StatusBar;
import com.mrogrape.notepad.ui.ToolbarMenu;
import com.mrogrape.notepad.ui.UpdateInfoDialog;
import com.mrogrape.notepad.ui.editor.TextEditor;
import com.mrogrape.notepad.ui.filechooser.NotepadFileChooser;
import com.mrogrape.notepad.ui.filechooser.OpenOptionPane;
import com.mrogrape.notepad.ui.filechooser.SaveOptionPane;
import com.mrogrape.notepad.ui.find.FindDialog;
import com.mrogrape.notepad.ui.library.LibraryPane;

/**
 * 程序中的所有视图对象。
 * 
 * @author 110046
 *
 */
public class ViewContext {

	/**
	 * 获取程序主窗体对象
	 * 
	 * @return
	 */
	public synchronized static MainFrame getMainFrame() {

		if (ViewContext.mainFrame == null) {
			ViewContext.mainFrame = new MainFrameAction();
		}

		return ViewContext.mainFrame;
	}

	private static MainFrame mainFrame = null;

	/**
	 * 获取当前活动的文本编辑器。
	 * 
	 * @return
	 */
	public synchronized static TextEditor getCurrentTextEditor() {

		if (ViewContext.mainFrame == null) {
			return null;
		}

		return ViewContext.mainFrame.getCurrentTextEditor();
	}

	/**
	 * 获取文件选择器。
	 * 
	 * @return
	 */
	public synchronized static NotepadFileChooser getFileChooser() {

		if (ViewContext.fileChooser == null) {
			ViewContext.fileChooser = new NotepadFileChooser();
		}

		return ViewContext.fileChooser;
	}

	/** 文件选择器 */
	private static NotepadFileChooser fileChooser = null;

	/**
	 * 获取打开文件选项窗格。
	 * 
	 * @return
	 */
	public static OpenOptionPane getOpenOptionPane() {

		if (ViewContext.openOptionPane == null) {
			ViewContext.openOptionPane = new OpenOptionPane();
		}

		return ViewContext.openOptionPane;
	}

	/** 打开文件选项窗格 */
	private static OpenOptionPane openOptionPane = null;

	/**
	 * 获取保存文件选项窗格。
	 * 
	 * @return
	 */
	public static SaveOptionPane getSaveOptionPane() {

		if (ViewContext.saveOptionPane == null) {
			ViewContext.saveOptionPane = new SaveOptionPane(null);
		}

		return ViewContext.saveOptionPane;
	}

	/** 保存文件选项窗格 */
	private static SaveOptionPane saveOptionPane = null;

	/**
	 * 获取查找和替换对话框
	 * 
	 * @return
	 */
	public synchronized static FindDialog getFindAndReplaceDialog() {

		if (ViewContext.findDialog == null) {
			ViewContext.findDialog = new FindDialog(ViewContext.getMainFrame());
		}

		return ViewContext.findDialog;
	}

	/** 查找和替换对话框 */
	private static FindDialog findDialog = null;

	/**
	 * 获取“文件属性”对话框
	 * 
	 * @return
	 */
	public synchronized static FileProperyDialog getFilePropertyDialog() {

		if (ViewContext.filePropertyDialg == null) {

			ViewContext.filePropertyDialg = new FileProperyDialog((Frame) ViewContext.mainFrame);
		}

		return ViewContext.filePropertyDialg;

	}

	/** 文件属性对话框 */
	private static FileProperyDialog filePropertyDialg = null;

	/**
	 * 获取默认等宽字体。
	 * 
	 * @return
	 */
	public synchronized static Font getDefaultMonospacedFont() {

		if (ViewContext.defaultMonospaceFont == null) {

			ViewContext.defaultMonospaceFont = StyleContext.getDefaultStyleContext().getFont("Courier New", Font.PLAIN,
					14);
		}

		return ViewContext.defaultMonospaceFont;
	}

	/** 默认等宽字体 */
	private static Font defaultMonospaceFont = null;

	/**
	 * 获取默认阅读字体。
	 * 
	 * @return
	 */
	public synchronized static Font getDefaultDisplayFont() {

		if (ViewContext.defaultReadFont == null) {

			ViewContext.defaultReadFont = UIManager.getFont("Menu.font");
		}
		return ViewContext.defaultReadFont;
	}

	private static Font defaultReadFont;

	/**
	 * 获取“最近使用的文件”菜单。
	 * 
	 * @return
	 */
	public synchronized static RecentFileMenu getRecentFileMenu() {

		if (ViewContext.recentFileMenu == null) {

			ViewContext.recentFileMenu = new RecentFileMenu("Recent Files");
		}

		return ViewContext.recentFileMenu;
	}

	/** 最近使用的文件菜单 */
	private static RecentFileMenu recentFileMenu = null;

	/**
	 * 获取“主菜单传送数据处理器”。
	 * 
	 * @return
	 */
	public synchronized static TransferHandler getMainFrameTransferHander() {

		if (ViewContext.mainFrameTransferHandler == null) {

			ViewContext.mainFrameTransferHandler = new MainFrameTransferHandler();
		}

		return ViewContext.mainFrameTransferHandler;
	}

	/** 主菜单传送数据处理器 */
	private static TransferHandler mainFrameTransferHandler = null;

	/**
	 * 获取字体选择器并制定默认选择的字体。
	 * 
	 * @param font
	 * @return
	 */
	public synchronized static FontChooser getFontChooser(Font font) {

		if (ViewContext.fontChooser == null) {

			ViewContext.fontChooser = new FontChooser();
		}

		if (font != null) {
			ViewContext.fontChooser.setSelectedFont(font);
		}

		return ViewContext.fontChooser;
	}

	/** 字体选择器 */
	private static FontChooser fontChooser = null;

	/**
	 * 获取状态栏。
	 * 
	 * @return
	 */
	public static StatusBar getStatusBar() {

		if (ViewContext.statusBar == null) {
			ViewContext.statusBar = new StatusBar();
		}

		return ViewContext.statusBar;
	}

	/** 状态栏对象。 */
	private static StatusBar statusBar;

	/**
	 * 获取工具栏菜单。
	 * 
	 * @return
	 */
	public synchronized static ToolbarMenu getToolbarMenu() {

		if (ViewContext.toolbarMenu == null) {

			ViewContext.toolbarMenu = new ToolbarMenu();
		}

		return ViewContext.toolbarMenu;
	}

	private static ToolbarMenu toolbarMenu;

	/**
	 * 获取文件夹选择器。
	 * 
	 * @return
	 */
	public synchronized static FolderChooser getFolderChooser() {

		if (ViewContext.folderChooser == null) {
			ViewContext.folderChooser = new FolderChooser();
		}

		return ViewContext.folderChooser;
	}

	/** 文件夹选择器 */
	private static FolderChooser folderChooser;

	/**
	 * 获取跳转到行对话框。
	 * 
	 * @return
	 */
	public synchronized static GotoLineDialog getGotoLineDialog() {

		if (ViewContext.gotoLineDialog == null) {
			ViewContext.gotoLineDialog = new GotoLineDialog((Frame) ViewContext.getMainFrame());
		}

		return ViewContext.gotoLineDialog;
	}

	private static GotoLineDialog gotoLineDialog;
	
	/**
	 * 获取"库视图"窗体
	 * 
	 * @return
	 */
	public synchronized static LibraryPane getLibraryPane() {

		if (ViewContext.libraryPane == null) {
			ViewContext.libraryPane = new LibraryPane();
		}

		return ViewContext.libraryPane;
	}

	private static LibraryPane libraryPane;
	
	/**
	 * 获取"更新日志"对话框
	 * 
	 * @return
	 */
	public synchronized static UpdateInfoDialog getUpdateInfoDialog() {

		if (ViewContext.updateInfoDialog == null) {
			ViewContext.updateInfoDialog = new UpdateInfoDialog((Frame) ViewContext.mainFrame);
		}

		return ViewContext.updateInfoDialog;
	}

	private static UpdateInfoDialog updateInfoDialog;
}
